iT邦幫忙

2021 iThome 鐵人賽

DAY 25
0

昨天有成功使用 Ansible 執行一個 echo 印出東西了,這在 Ansible 裡面稱作 ad hoc 模式,可以用來執行單個 task。不過在實際的應用場景裡面,我們應該都會需要執行多個命令,才能完成整個流程,這種時候就是 playbook 派上用場的時候了。

簡介

playbook 由多個 "play" 組成,每個 play 表示我們預計完成的「目標」,並且裡面會包一些 task,也就是為了達成目標所需要做的事情。一個簡單的範例如下面所示(取自官方文件)。

---
- name: Update web servers
  hosts: webservers
  remote_user: root

  tasks:
  - name: Ensure apache is at the latest version
    ansible.builtin.yum:
      name: httpd
      state: latest
  - name: Write the apache config file
    ansible.builtin.template:
      src: /srv/httpd.j2
      dest: /etc/httpd.conf

- name: Update db servers
  hosts: databases
  remote_user: root

  tasks:
  - name: Ensure postgresql is at the latest version
    ansible.builtin.yum:
      name: postgresql
      state: latest
  - name: Ensure that postgresql is started
    ansible.builtin.service:
      name: postgresql
      state: started

最上層的 Update web serversUpdate db servers 就是這份 playbook 包含的兩個 play,底下透過 hostsremote_user 分別定義需要執行這份 play 的 host,還有 ssh 連線所使用的 user。

而實際需要執行的 task 就被定義在 tasks 這個 array 裡面,對於每個 task,我們也需要給他一個 name 作為識別,接下來底下就是執行了什麼操作,這邊的 ansible.builtin.template 還有 ansible.builtin.service 等字串在 Ansible 裡面被稱作 module,是會實際給 Ansible 執行的東西,相關的文件可以在這邊找到

冪等 (idempotency)

講到 playbook,這邊還要談談有關冪等,因為我們可能會需要執行多次 playbook(像是更新版本的時候),所以需要確保重複執行不會產生意料之外的後果。在 Ansible 中,module 通常會被設計成「讓 host 變成期望的狀態」而不是「執行特定的操作」,所以會比較容易實現冪等。但也不是所有的 module 都遵守這個原則,所以官方建議在使用前還是開個沙盒環境測試一下。

小結

今天翻了好多 Ansible 官方文件,對於一些名詞的定義還不是很清楚,像是 module, collection, role... 之類的,或許我還要再多使用一段時間才能搞懂。


上一篇
Day 24:Ansible 的一些設定
下一篇
Day 26:Container != Docker Container
系列文
這個 site 就是遜啦 - SRE 30 天登大人之旅30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言